#ifndef MAP_UTILS
#define MAP_UTILS
#include <vector>
#include <map>
#include <string>
#include <functional>

//******************************
//          结构体定义
//******************************
/**
 * @struct 表示顶点的信息，包括坐标、ID
 * @param x 该顶点的x坐标
 * @param y 该顶点的y坐标
 * @param id 该顶点的ID
*/
struct Pose
{
    Pose(){}
    Pose(double _x, double _y, int _id){x=_x; y=_y; id=_id;}

    double x = 0;     //位置x
    double y = 0;     //位置y
    int   id = 0;       
};

/**
 * @struct 表示道路相关信息的结构体,用于表示道路的顶点
 * @param relatedVertexes 与该顶点关联的顶点所对应的边的ID
 * @param relatedEdges 与该顶点关联的顶点
 * @param vertexPos 该顶点的位置和ID
*/
struct Vertex
{
    Vertex(){}
    Vertex(std::vector<int> related_vertexes, std::vector<int> related_edges, Pose vertex_pos)
    {
        relatedVertexes = related_vertexes;
        relatedEdges    = related_edges;
        vertexPos         = vertex_pos;
    }

    std::vector<int> relatedVertexes;        //与该顶点关联的所有顶点和对应的边的ID，是否关联，根据车道标志（左转等）确定
    std::vector<int> relatedEdges;
    Pose vertexPos;                 //该顶点的位置和ID
};
/**
 * @struct 表示道路相关信息的结构体,用于表示道路的边
 * @param relatedVertexes 该道路两端的顶点ID
 * @param attr_type 边属性0：id
 * @param attr_dis 边属性1：1代表直行，2代表左转弯，3代表右转弯
 * @param attr_angle 边属性3：直行时取0，转弯时取转弯的角度，单位：度
 * @param attr_cost 边属性4：计算最短路径时使用的代价值
 * @param attr_isReverse 边属性5：入库时，是否属于倒车边，车库外的边默认false
*/
struct Edge
{
    Edge(){}
    Edge(int id, std::vector<int> related_vertexes, int type,
                double dis, double angle, int cost, bool isReverse = false)
    {
        relatedVertexes.clear();
        relatedVertexes = related_vertexes;
        
        attr_id         = id;
        attr_type       = type;
        attr_dis        = dis;
        attr_angle      = angle;
        attr_cost       = cost;
        attr_isReverse  = isReverse;
    }

    std::vector<int> relatedVertexes;        //该道路两端的顶点ID
    int attr_id;                        //边属性0：id
    int attr_type;                      //边属性1：1代表直行，2代表左转弯，3代表右转弯
    double attr_dis;                    //边属性2：直行时代表路段长度，转弯时代表路段半径，单位：mm
    double attr_angle;                  //边属性3：直行时取0，转弯时取转弯的角度，单位：度
    int attr_cost;                      //边属性4：计算最短路径时使用的代价值
    bool attr_isReverse;                //边属性5：入库时，是否属于倒车边，车库外的边默认false
};

const double dx = -928, dy = -126, di = 250;// 定义实际地图坐标原点与场景地图左下角之间的坐标差,unit:mm
const double theta_bias = 0.003026; // 坐标轴偏差的角度，为正是使规划出的轨迹的坐标顺时针旋转
const double wheelbase = 0.100;
#endif